package com.design.singleton;

/***
 * 
 * @author cWX241319
 *单例模式的类是不可以实现 Cloneable 接口的，这与 Singleton 模式的初衷相违背。不实现Cloneable接口就不会影响单例，
 *但有时候单例类可以继承自其它类，如果其父类实现了 clone() 方法的话，就必须在我们的单例类中复写 clone() 方法来阻止对单例的破坏。
 */
public class SingletonClone implements Cloneable{

	private static final SingletonClone  singleton = new SingletonClone();
	
	private SingletonClone() {}
		
	
	public static SingletonClone getSingletonClone() {
		
		return singleton;
	}
	
	
	/***
	 * 通过重写父类或接口的clone方法，在方法中抛出异常，以防止通过调用clone方法克隆新的实例来破坏单例模式
	 */
	protected Object clone() throws CloneNotSupportedException {
		
		throw new CloneNotSupportedException();
	}
	
	
	public static void main(String[] args) {
		
		SingletonClone singleton1 = SingletonClone.getSingletonClone();
		
		SingletonClone singleton2 = SingletonClone.getSingletonClone();
		
		System.out.println(singleton1 == singleton2);
					
			try {
				
				//试图通过实例对象的clone函数克隆一个新的实例，破坏单例模式规则
				SingletonClone singleton3 = (SingletonClone) singleton1.clone();
				
				System.out.println(singleton1 == singleton3);
				
			} catch (CloneNotSupportedException e) {

				e.printStackTrace();
			}
			
			

	}
	
}
